package com.tedu.API.ee;

import org.junit.Test;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.*;

/**
 * 流--传输数据---传输数据过程中绝对不能出错【处理手段】
 * 标准流结合异常--标准IO
 *
 * 异常：
 * java面向对象语言，程序中所出现的所有错误定义为对象【处理对应的错误】
 *
 * Throwable顶级异常超类
 * Exception 异常：描述程序级别的错误--有解决方案
 *               编译期：RunTimeException异常的表示类
 *                       FileOutputStream创建对象----波浪线--抛出异常
 *               检查异常：通常都是编译器检查处理，程序直接报错，抛出
 *               解决方案：1>捕获异常(*)
 *                       2>抛出异常---抛出方法之外--打印在控制台
 *
 *               运行期：控制台直接显示异常对象【异常对象名字，产生原因】
 *               非检查异常：控制台输出异常对象的名称 RunTimeException异常表示
 *               【throw与throws---RunTimeException】
 *
 * Error错误：描述系统级别错误---一旦出现，程序宕机
 *           非常低--->递归问题自己调自己--->
 */
public class EE {
    /**
     * Error错误---无解
     * 模拟：方法调自己--栈溢出错误
     * StackOverflowError栈溢出错误
     * ---程序宕机--
     * while(true){
     *     拼接字符串
     * }
     */
    public static void method(){

    }
    @Test
    public void testError(){
        EE.method();
    }

    /**
     * Exception异常：检查异常【出现在编译期】
     *               两种处理手段：1>捕获异常:记录错误--产生异常原因
     *                          语法：try{
     *                              怀疑代码可能有异常或者提示异常
     *                          }catch(小异常的名字 e){
     *                              e.printStacktrace(); 打印异常信息
     *                          }catch(中异常 e){
     *
     *                          }catch(大异常 e){
     *                              Exception
     *                          }finally{
     *                              一定执行代码块
     *                          }
     *
     *                          2>抛出异常 throws 异常的名字
     *                          异常关键字:throw和throws
     *               非检查异常【出现在运行期】---代码无错误--控制台
     *----------------------------
     * 异常：  FileNotFoundException   文件不存在异常
     * 产生原因:   路径写错,文件名写错，
     * 异常：   NullPointerException  空指针异常
     * 产生原因：获取的字符串为空，数组：值为空  集合：元素为空
     *异常：StringIndexOutOfBoundsException  字符串下标越界异常
     * 产生原因：字符串下标没有对应的字符
     *异常：NumberFormatException  数字转换异常
     * 产生原因：字符串不是正确的类型,
     */
    @Test
    public void testException() throws FileNotFoundException {
        //检查异常【出现在编译期】--报波浪线
//        FileOutputStream fis=new FileOutputStream("");

        //非检查异常【出现在运行期】----控制台
        try {
            String str="a";
            str.length();
            str.charAt(1);  //通过下标获取对应的字符
            Integer.parseInt(str); //解析字符串，转换为对应的类型
        }catch(StringIndexOutOfBoundsException e){
            e.printStackTrace();
            System.out.println("下标越界异常");
        }
        catch (NumberFormatException e) {
            e.printStackTrace(); //打印异常
            System.out.println("数字转换异常");
        }catch(Exception e){
            e.printStackTrace();
        }
        finally {
            System.out.println("一定会执行的代码块");
        }
        /**
         * 作业：5个异常
         * 提示：查API--java.lang
         *      字符串，包装类，集合，IO流
         */

    }



    @Test
    public void testHomeWork1(){
        //NoSuchElementException 没有元素异常
        //创建list集合。使用Iterator遍历
        List<String> list=new ArrayList<>();
        list.add(null);
        Iterator<String> it=list.iterator();
//        for (int i=0;i<10;i++){
//            it.next();
//        }

        //ClassCastException 强制转换不兼容类型
        //通过equals()
        //创建类对象
//        equ equs=new equ("zhang");
//        System.out.println(equs.equals(12));

        //ConcurrentModificationException 并发修改异常
        //创建集合【使用上一个集合】，在遍历的同时删除元素
        //添加5个元素
//        list.add("张");list.add("王");list.add("里");list.add("的");list.add("人");
//        while (it.hasNext()){
//            it.next();
//            list.clear();
//        }
        //ArithmeticException
//        int A=1/0;

        //ParseException 解析异常
        //定义simpleDateFormat对象，parse()
        SimpleDateFormat sdf=new SimpleDateFormat();
//        String birth="张门套";
//        try {
//            sdf.parse(birth);
//        }catch (ParseException e){
//            e.printStackTrace();
//        }
//        finally {
//            System.out.println("解析异常");
//        }

    }
}
class equ{
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public equ(String name) {
        this.name = name;
    }

//    @Override
//    public boolean equals(Object obj) {
//        boolean flag=false;
//        equ equs=(equ)obj;
//        return true;
//    }
}
